from mitmproxy import ctx
import csv
import time
import os

"""
  【 Mitmproxy 抓取接口信息 导入 CSV 文件 】

     [ 前 提 条 件 ]
        1.浏览器开启代理
        （1）FireFox 开启 8888 代理（ 浏览器代理 ）
             首选项 > 网络设置 > 手动代理配置：127.0.0.1:8888 （ 去掉'为所有协议使用相同代理服务器'勾选 ）
        （2）Chrome 开启 8888 代理 ( 系统代理 )
             设置 > 高级 > 系统 > 打开您计算机的代理设置
        （3）Safari 开启 8888 代理 ( 系统代理 )
             偏好设置 > 高级 > 代理 > 更改设置

        2.命令行 开启抓包命令
            mitmdump -s ./recorder.py -p 8888

        3.配置SSL证书
         （1）使用 Safari 开启系统代理、并启动命令行代理
         （2）使用 Safari 进入 mitm.it 网站下载证书 mitmproxy-ca-cert.pem
         （3）使用 FireFox 进行授权证书：
                选项---隐私与安全---安全---证书---查看证书---导入证书
                在“证书颁发机构”中找到mitmproxy，编辑信任，勾选相应条目
         （4）关闭 系统代理
         （5）开启 FireFox 代理

     [ 操 作 步 骤 ]
        1.执行抓取操作
        （1）开启 FireFox 代理
        （2）开启 抓包命令：mitmdump -s ./recorder.py -p 8888
        2.将抓取在CSV中的接口信息 手动导入 用例模板xlsx中
        3.补齐必要的字段
"""

# 需要抓取的host
host_list = [
    "http://192.168.31.9:1180/api",
    "http://localhost:1122/api_local",
    "http://123.56.99.53:9001/api"
]
# http://123.56.99.53:9001/login/

# 获取'执行该文件'目录的绝对路径
current_dir = os.path.abspath('.')
print(current_dir)


class Filter:

    def __init__(self):
        self.tmp = time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time()))

        # 执行路径：根目目录
        # self.csv_file = f"{current_dir}/mitm_recorder/core/file/mitm_{self.tmp}.csv"
        # 执行路径：二级目录
        self.csv_file = f"{current_dir}/core/file/mitm_{self.tmp}.csv"

        self.write(['标签名称', '接口名称', '接口地址', '请求方式', '请求头文件', '请求参数', '请求正文体', '验证模式',
                    '待比较关键字段名列表', '期望的关键字段值列表', '期望的响应字段列表', '是否为依赖接口', '依赖字段名列表',
                    '依赖等级', '用例状态'])
        self.write(['tag_name', 'interface_name', 'interface_url', 'request_method', 'request_header', 'request_params',
                    'request_body', 'verify_mode', 'compare_core_field_name_list', 'expect_core_field_value_list',
                    'expect_field_name_list', 'is_depend', 'depend_field_name_list', 'depend_level', 'case_status'])

    def write(self, row):
        with open(self.csv_file, 'a+', encoding='utf-8-sig', newline='') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerow(row)

    def request(self, flow):
        for host in host_list:
            if host in flow.request.url:
                url_params_list = flow.request.url.split("?")
                interface_url = url_params_list[0].replace(host, "")
                request_params = len(url_params_list) == 2 and "?" + url_params_list[1] or ""
                request_method = flow.request.method
                headers = flow.request.headers
                request_header = dict()
                if request_method != "GET":
                    request_header["Content-Type"] = headers.get("Content-Type")
                    # request_header["Cookie"] = headers.get("Cookie", "")
                request_body = flow.request.get_text()
                self.write(['', '', interface_url, request_method, str(request_header), request_params, request_body,
                            1, 'httpCode', '200', '', False, '', '', False])
                # 在控制台打印
                ctx.log.info("--------------" + flow.request.url + "--------------")


# //类名的加载，也可以定义多个类，然后以数组的形式添加，进行加载
addons = [
    Filter()
]
